#include<cstdio>//uncle-lu
#include<cstring>
#include<algorithm>
template<class T>void read(T &x)
{
	x=0;int f=0;char ch=getchar();
	while(ch<'0'||ch>'9') { f|=(ch=='-'); ch=getchar(); }
	while(ch<='9'&&ch>='0') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
	x = f ? -x : x;
	return ;
}

struct node{
	int start, end, w, f;
	friend bool operator<(const node a, const node b)
	{
		return a.start < b.start;
	}
};
node line[10010];
int F[1010][1010];
int l, n, m;

int main()
{
	read(l);read(n);read(m);
	memset(F, -1, sizeof(F));
	int len;
	for (int i = 1; i <= n; i++) 
	{
		read(line[i].start);read(len);read(line[i].f);read(line[i].w);
		line[i].end = line[i].start + len;
	}

	std::sort(line+1, line+1+n);

	F[0][0] = 0;
	for (int i = 1; i <= n; i++) 
		for (int j =  m-line[i].w; j >= 0; j--) 
			if(F[line[i].start][j]!=-1)
				F[line[i].end][j+line[i].w] = std::max(F[line[i].end][j+line[i].w], F[line[i].start][j] + line[i].f );

	int ans = F[l][0];
	for (int i = 0; i <= m; i++) 
		ans = std::max(ans, F[l][i]);

	printf("%d", ans);

	return 0;
}

